package br.com.sgc.session;

import java.util.List;

import javax.ejb.EJB;
import javax.ejb.Stateless;

import br.com.sgc.dao.FuncionarioDao;
import br.com.sgc.dao.PessoaFisicaDao;
import br.com.sgc.dao.SegurancaDao;
import br.com.sgc.entities.geral.Pessoa;
import br.com.sgc.entities.geral.PessoaFisica;
import br.com.sgc.entities.rh.Cargo;
import br.com.sgc.entities.rh.Funcao;
import br.com.sgc.entities.rh.Funcionario;
import br.com.sgc.entities.seguranca.Usuario;
import br.com.sgc.exception.ValidacaoException;
import br.com.sgc.helper.ValidadorCNPJCPFUtil;

import com.encripta.EncriptaSenha;

@Stateless
public class FuncionarioSession extends GenericSession<Funcionario> {

	private static final long serialVersionUID = -7138900995369159499L;

	@EJB private FuncionarioDao dao;
	@EJB private PessoaFisicaDao daoPessoaFisica;
	@EJB private EnderecoSession enderecoSession;
	@EJB private TelefoneSession telefoneSession;
	@EJB private GenericSession<Cargo> cargoSession;
	@EJB private GenericSession<Funcao> funcaoSession;
	@EJB private SegurancaDao segurancaDao;
	

	public List<Funcionario> searchFuncionario(Funcionario funcionario) {
		return dao.searchFuncionario(funcionario);
	}
	
	
	
	public List<Funcionario> searchFuncionarioSemUsuario(Funcionario funcionario) {
		return dao.searchFuncionarioSemUsuario(funcionario);
	}

	
	
	public Funcionario findFuncionarioByMatricula(String matricula){
		return dao.findFuncionarioByMatricula(matricula); 
	}
	
	@Override
	public Funcionario update(Funcionario t) throws ValidacaoException {			
		Cargo cargo = cargoSession.findById(Cargo.class, t.getCargo().getId());
		Funcao funcao = funcaoSession.findById(Funcao.class, t.getFuncao().getId());
		
		t.setCargo(cargo);
		t.setFuncao(funcao);
		if(t.getUsuario().getSenha() != null && !t.getUsuario().getSenha().isEmpty()){
			t.getUsuario().setSenha(EncriptaSenha.criptografa(t.getUsuario().getSenha()));
		} else {
			Funcionario funcionario = dao.findById(Funcionario.class, t.getId(), true);
			Usuario usuario = segurancaDao.findById(Usuario.class, funcionario.getUsuario().getId(), false);
			t.getUsuario().setSenha(usuario.getSenha());
		}
		

		return super.update(t);
	}
	
	public void validarCPF(String cpf) throws ValidacaoException {
		String erro = "";
		if (cpf == null || cpf.trim().equals("")) {
			erro +="Campo CPF precisa ser preenchido! <br />";
		} else if (!ValidadorCNPJCPFUtil.isCPFValido(cpf)) {
			erro +="O CPF informado � inv�lido! <br />";
		}
		if (erro != "") {
			throw new ValidacaoException(erro);
		}
	}
	
	public Funcionario findByCPF(String documento, Long idClinica){
		Pessoa pessoaDB = null;
		Funcionario funcionario = new Funcionario();
		pessoaDB = daoPessoaFisica.checkDocumentoPF(documento, idClinica);
		if(pessoaDB == null){
			pessoaDB = new PessoaFisica();
			funcionario.setCpf(documento);
		} else {
		
			PessoaFisica pf = (PessoaFisica) pessoaDB;
			funcionario.setCpf(pf.getCpf());
			funcionario.setDataNascimento(pf.getDataNascimento());
			funcionario.setId(pf.getId());
			funcionario.setAtivo(pf.getAtivo());
			funcionario.setEnderecos(enderecoSession.getEnderecosPersistent(pf.getEnderecos()));
			funcionario.setTelefones(telefoneSession.getTelefonesPersistent(pf.getTelefones()));
			funcionario.setNome(pf.getNome());
			funcionario.setRg(pf.getRg());
			funcionario.setSexo(pf.getSexo());

		}
		
		return funcionario;
	}



	public Funcionario findByUsuario(Usuario usuarioLogado) {
		return dao.findByUsuario(usuarioLogado);
	}
}
